#include <mqueue.h>
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#include <string.h>
//定义消息队列的名称
#define QUEUE_NAME "/test_queue"

static mqd_t mqd;

//定义两个线程函数
void* thread_func1(void* arg){
    //负责发送消息
    char* msg = "Hello from thread 1";
    if (mq_send(mqd, msg, strlen(msg) + 1, 0) == -1) {
        perror("mq_send");
    }
    return NULL;
}

void* thread_func2(void* arg){
    //负责接收消息
    char buffer[256];
    if (mq_receive(mqd, buffer, 256, NULL) == -1) {
        perror("mq_receive");
    } else {
        printf("Received message: %s\n", buffer);
    }
    return NULL;
}
    
int main(int argc, char const *argv[])
{
    //测试消息队列
    struct mq_attr attr;
    attr.mq_flags = 0; // 队列属性标志
    attr.mq_maxmsg = 10; // 队列最大消息数
    attr.mq_msgsize = 256; // 队列消息最大字节数
    attr.mq_curmsgs = 0; // 当前消息数
    //创建消息队列
    mqd = mq_open(QUEUE_NAME, O_CREAT | O_RDWR, 0644);
    if (mqd == (mqd_t)-1) {
        perror("mq_open");
        exit(EXIT_FAILURE);
    }
    //设置消息队列属性
    if (mq_setattr(mqd, &attr, NULL) == -1) {
        perror("mq_setattr");   
        mq_close(mqd);
        exit(EXIT_FAILURE);
    }
    printf("消息队列创建成功\n");
    //创建两个线程
    pthread_t thread1, thread2;
    pthread_create(&thread1, NULL, thread_func1, NULL);
    pthread_create(&thread2, NULL, thread_func2, NULL);
    //等待线程结束
    pthread_join(thread1,NULL);
    pthread_join(thread2,NULL);
    //关闭消息队列
    if(mq_close(mqd)== -1){
        perror("mq_close");
    }else{
        printf("消息队列关闭成功\n");
    }
    //删除消息队列
    if(mq_unlink(QUEUE_NAME) == -1){
        perror("mq_unlink");
    } else {
        printf("消息队列删除成功\n");
    }
    return 0;
}
